"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 25、内置库：正则表达式  re.py
"""

"""
正则表达式就是记录文本规则的代码
可以查找操作符合某些复杂规则的字符串

1、处理字符串   2、处理日志   3. 提取获取字符串

在 python 中使用正则表达式：
    把正则表达式作为模式字符串
    正则表达式可以使用原生字符串来表示
    原生字符串需要在字符串前加上 r"string"

"""

import re

# compile： 将 字符串 转化成 python 正则表达式对象

# 匹配包含 hogwarts 的字符串
pattern = r"hogwarts"
# 转化成正则对象,可以直接使用正则的方法
prog = re.compile(pattern)

"""
匹配字符串常用方法 ：
    1、match()   : 从字符串的开始处进行匹配
    2、search()  ：在整个字符串中搜索第一个匹配的值
    3、findall() : 在整个字符串中搜素所有符合正则表达式的字符串，返回列表
"""

# 所有方法的参数基础都是 pattern：正则表达式对象


# match()   从字符串的开始进行匹配
# 匹配以hog开头的字符串
pattern = r"hog\w+"
s1 = 'Hogwarts is good'
# 传入的 pattern 为目标匹配字符串  s1 是字符串    re.I 是忽略大小写
res = re.match(pattern, s1, re.I)
print(res)  # 返回 ： <_sre.SRE_Match object; span=(0, 8), match='hogwarts'>

print(f'匹配值的起始位置：{res.start()}')  # 结果为： 匹配值的起始位置：0
print(f'匹配值的结束位置：{res.end()}')  # 结果为： 匹配值的结束位置：8
print(f'匹配位置的元组：{res.span()}')  # 结果为： 匹配位置的元组区间：(0, 8)

# 重点 + 常用
print(f'要匹配的字符串：{res.string}')  # 结果为： 要匹配的字符串：Hogwarts is good
print(f'拿到匹配的数据：{res.group()}')  # 结果为： 拿到匹配的数据：hogwarts

s2 = 'l like halibote hogwarts'
res = re.match(pattern, s2, re.I)
print(res)  # 匹配不到  返回None

# ==================================================================================================================

# search()  在整个字符串中搜素第一个匹配的值
s1 = 'hogwarts is good'
s2 = 'l like halibote hogwarts'
res = re.search(pattern, s1, re.I)
print(res)  # 结果为： <_sre.SRE_Match object; span=(0, 8), match='hogwarts'>
print(res.group())  # hogwarts

res = re.search(pattern, s2, re.I)
print(res)  # 结果为： <_sre.SRE_Match object; span=(16, 24), match='hogwarts'>
print(res.group())  # hogwarts

# ========================================
# findall()  在整个字符串中搜索所有符合正则表达式的字符串，返回列表
s1 = 'hogwarts is good,i like hogwarts'  # 有多个匹配项
res_list = re.findall(r"hog\w+", s1, re.I)
print(res_list)  # 返回一个列表： ['hogwarts', 'hogwarts']

# 替换字符串
"""
sub(pattern,rep,string,[count],[flags])
pattern : 正则表达式
rep : 要匹配的字符串
string : 要被查找替换的原始字符串
count : 可选，表示替换的最大次数，默认值为0.表示替换所有匹配
flags : 可选，控制匹配方式
"""

a = 'I am a tester'
# pattern:被替换的对象   rep：替换的对象   string：是在那个字符串中替换
sub1 = re.sub('tester', 'dev', a)
# 结果： I am a dev
print(sub1)

# 匹配手机号码
pattern = r"1[34578]\d{9}"
sub2 = '中奖号码 123456,联系电话：15688899999'
result = re.sub(pattern, '156xxxx9999', sub2)
# 结果：中奖号码 123456,联系电话：156xxxx9999
print(result)

# split: 以正则表达式切割字符串 返回来一个列表
"""
split(pattern,string,[maxsplit],[flags])
pattern : 正则表达式
string : 要被查找替换的原始字符串
maxsplit : 可选，表示最大拆分次数
flags ： 可选，控制匹配方式
"""

# 处理 url  结果为： ['https://www.baidu.com/s', 'ie=utf-8', 'f=3', 'rsv_bp=1'......]
pattern = r"[?|&]"
url = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=38036936_1_hao_pg&wd=%E5%93%88%E5%A7%86%E6%B3%A2%E7%89%B9&fenlei=256&rsv_pq=81379fdf0002575a&rsv_t=05f2tj6MDul0hALUlpj%2BryqDYNsUBvHSAgeWpA2rDDHg1hxrJRT4mit7Fqo48pjxNIb0rpkyYIE&rqlang=cn&rsv_enter=1&rsv_dl=ts_0&rsv_sug3=10&rsv_sug1=8&rsv_sug7=100&rsv_sug2=1&rsv_btype=i&prefixsug=hamubote&rsp=0&inputT=5445&rsv_sug4=6106'
r = re.split(pattern, url)
print(r)
